import { IGlobalState } from '@/store';
import { SET_CURRENT_TYPE, SET_NEWS_LIST } from '@/store/home/actionTypes';
import { INewsInfo, IPostData, NAV_TYPES } from '@/typings';
import { computed, ComputedRef } from 'vue';
import { Store } from 'vuex';

/**
 * 发送数据请求获取新闻列表的信息
 * @param store 仓库
 * @returns newsList 一个新闻列表ComputedRef类型数据
 */
function useNewsList(store: Store<IGlobalState>): ComputedRef<INewsInfo[]> {
  const state = store.state.home;

  //获取请求参数
  //类型
  const type: NAV_TYPES = computed(() => state.currentType).value;
  //页码
  const pageNum: number = computed(() => state.newsList.pageNum).value;
  const count: number = computed(() => state.newsList.count).value;
  //最终的数据列表
  const newsList: ComputedRef<INewsInfo[]> = computed(
    () => state.newsList.news
  );

  //发送请求
  store.dispatch(`home/${SET_NEWS_LIST}`, <IPostData>{
    type,
    pageNum,
    count
  });

  return newsList;
}

/**
 * 更改新闻类型并重新请求新闻列表数据
 * @param store
 * @returns 返回一个函数(内部返回一个新闻列表数据)
 */
function useNavType(store: Store<IGlobalState>) {
  return (type: NAV_TYPES): ComputedRef<INewsInfo[]> => {
    //更改新闻类型
    store.dispatch(`home/${SET_CURRENT_TYPE}`, type);

    //发送数据请求新闻列表
    const newsList: ComputedRef<INewsInfo[]> = useNewsList(store);

    return newsList;
  };
}

export { useNewsList, useNavType };
